package com.xja.wechat.service.Imp;

import com.xja.wechat.common.Constant;
import com.xja.wechat.domain.mapper.WX_FSMapper;
import com.xja.wechat.domain.mapper.WX_MsgDetailMapper;
import com.xja.wechat.domain.mapper.WX_UserMapper;
import com.xja.wechat.domain.model.WX_FS;
import com.xja.wechat.domain.model.WX_MsgDetail;
import com.xja.wechat.domain.model.WX_User;
import com.xja.wechat.service.WxUserService;
import org.jdom2.CDATA;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;


@Service
public class WxUserServiceImpl implements WxUserService {
    @Autowired
    private WX_UserMapper wx_userMapper;
    @Autowired
    private WX_MsgDetailMapper wx_MsgDetailMapper;
    @Autowired
    private WX_FSMapper wx_fsMapper;

    @Override
    public String updateWxMessage(Element rootElement) {

        //获取xml内容
        String toUserName = rootElement.getChildText("ToUserName");//开发者微信号
        String fromUserName = rootElement.getChildText("FromUserName");//用户的openID
        String createTime = rootElement.getChildText("CreateTime");//消息创建时间
        String msgType = rootElement.getChildText("MsgType");//消息类型，事件类型为"event"
        String event = rootElement.getChildText("Event");//事件类型，subscribe(订阅)、unsubscribe(取消订阅)
        String eventKey = rootElement.getChildText("EventKey");//关注事件扫描带有参数的二维码
        /**
         * msgType消息类型--事件类型event、文本类型text、图片为image、
         *  语音为voice、视频为video、小视频为shortvideo、地理位置为location、链接为link、
         */
        String xml = checkMsgAndResultXml(toUserName, msgType, fromUserName, event, eventKey);
        return xml;//10
    }

    /**
     * 根据消息进行判断
     *
     * @param toUserName   开发者微信号
     * @param msgType      消息类型
     * @param fromUserName 用户的openid
     * @param event        事件类型
     * @return
     */
    private String checkMsgAndResultXml(String toUserName, String msgType, String fromUserName, String event, String eventKey) {
        String xml = "";
        Element xmlMsg = new Element("xml");
        if (msgType.equals("event")) {
            //编写事件类型消息的方法
            xmlMsg = updateEvent(event, fromUserName, eventKey);
        } else if (msgType.equals("text")) {
            //编写文本类型消息的方法
        }
        if (xmlMsg != null) {


            xmlMsg.addContent(new Element("ToUserName").addContent(new CDATA(fromUserName)));
            xmlMsg.addContent(new Element("FromUserName").addContent(new CDATA(toUserName)));
            xmlMsg.addContent(new Element("CreateTime").addContent((System.currentTimeMillis() / 1000) + ""));
            Format format = Format.getCompactFormat();
            format.setEncoding("utf-8");
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            XMLOutputter outputter = new XMLOutputter();
            try {
                outputter.output(xmlMsg, byteArrayOutputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                xml = byteArrayOutputStream.toString("utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return xml;
    }

    /**
     * 进入事件类型中  event获取到事件类型中的某一类
     * 操作event事件
     *
     * @return
     */
    private Element updateEvent(String event, String fromUserName, String eventKey) {
        Element xmlMsg = null;
        if (event.equals("subscribe")) {
            System.out.println("进入关注事件");
            //进入关注事件
            /**消息排重---防止重复性的添加用户（5秒微信没有收到回复会进行重试，最多三次）
             * 判断用户是否已关注
             * 是--什么丢不管--返回空字符串
             * 不是--进行添加
             * 如果用户已经存在数据库切是取消关注状态---修改操作
             *
             * */
            /**
             * 通过用户的去获取用户基本信息，存入数据库
             */
            //根据查出数据库对应的数据信息
            WX_User wx_user_db = wx_userMapper.selectByOpenid(fromUserName);

            WX_User userInfo = Constant.getUserInfo(fromUserName);
            System.out.println(userInfo.toString());
            System.out.println("输出场景值 eventKey:" + eventKey);
            //必须判断是否是空字符串才能生效

            //获取推送消息并返回xml
            if (wx_user_db == null) {

                //调用insert方法
                int i = wx_userMapper.insert(userInfo);
                if (!eventKey.equals("") && eventKey.length() > 8) {
                    //!eventKey.equals("")---说明用户是通过扫描带有参数的二维码进入关注的
                    //和推广活动有关----只能新用户--取消关注在关注不行
                    String sceneId = eventKey.split("_")[1];//场景值ID,分享者ID
                    System.out.println("场景值id：" + sceneId);
                    //绑定
                    WX_FS wx_fs = new WX_FS();
                    wx_fs.setfId(Integer.valueOf(sceneId));
                    wx_fs.setsId(userInfo.getId());//拉去新关注用户ID
                    wx_fsMapper.insert(wx_fs);
                }
                System.out.println("添加的结果是" + i);
                xmlMsg = createXmlMsg("subscribe");
                //这时--fromUserName：为用户的     toUserName:该公众号的微信号
            } else {
                if (wx_user_db.getSubscribe().equals(0)) {
                    int i = wx_userMapper.updateByPrimaryKeySelective(userInfo);
                    System.out.println("用户取消关注了又重关注的" + i);
                    xmlMsg = createXmlMsg("subscribe");
                }
            }
            createXmlMsg("subscribe");
        } else if (event.equals("unsubscribe")) {
            System.out.println("进入取消关注事件");
            //进入取消关注事件
            /**
             * 修改关注状态
             */
            WX_User wx_user = new WX_User();
            wx_user.setOpenid(fromUserName);
            wx_user.setSubscribe(0);
            int i = wx_userMapper.updateByPrimaryKeySelective(wx_user);
            System.out.println("取消关注的状态为" + i);
        }
        return xmlMsg;
    }

    private Element createXmlMsg(String msgType) {
        List<WX_MsgDetail> list = wx_MsgDetailMapper.selectByactivity(msgType);
        Element xml = new Element("xml");
        if (msgType.equals("subscribe")) {
            Element articles = new Element("Articles");
            for (WX_MsgDetail wX_MsgDetail : list) {
                Element item = new Element("item");
                item.addContent(new Element("Title").addContent(new CDATA(wX_MsgDetail.getTitle())));
                item.addContent(new Element("Description").addContent(new CDATA(wX_MsgDetail.getDescription())));
                item.addContent(new Element("PicUrl").addContent(new CDATA(Constant.URL + wX_MsgDetail.getPurl())));
                //推文推送走的链接也会走一个网页授权
                String url = Constant.snsapi_userinfo(Constant.URL + wX_MsgDetail.getUrl());
                item.addContent(new Element("Url").addContent(new CDATA(url)));
                articles.addContent(item);

            }
            xml.addContent(new Element("MsgType").addContent(new CDATA("news")));
            xml.addContent(new Element("ArticleCount").addContent(list.size() + ""));
            xml.addContent(articles);
        }
        return xml;
    }
}